package com.rui.prototype.main;

import com.rui.prototype.model.DeepClazz;

/**
 * 原型模式
 * 原型模式是指原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。调用者不需要知道任何创建细节，不调用构造函数。
 * <p>
 * 原型模式包含如下角色：
 * 抽象原型类：规定了具体原型对象必须实现的的 clone() 方法。
 * 具体原型类：实现抽象原型类的 clone() 方法，它是可被复制的对象。
 * 访问类：使用具体原型类中的 clone() 方法来复制新的对象。
 * <p>
 * 适用场景：
 * 类初始化消耗资源较多。
 * new产生的一个对象需要非常繁琐的过程（数据准备、访问权限等）。
 * 构造函数比较复杂。
 * 循环体中生产大量对象时。
 * <p>
 * 优点：
 * 性能优良，Java自带的原型模式是基于内存二进制流的拷贝，比直接new一个对象性能上提升了许多。
 * 可以使用深克隆方式保存对象的状态，使用原型模式将对象复制一份并将其状态保存起来，简化了创建的过程。
 * <p>
 * 缺点：
 * 必须配备克隆（或者可拷贝）方法。
 * 当对已有类进行改造的时候，需要修改代码，违反了开闭原则。
 * 深克隆、浅克隆需要运用得当。
 *
 * @author ZhangRui
 * @date 2023/03/02 14:03
 **/
public class PrototypeMain {


    public static void main(String[] args) throws CloneNotSupportedException {

        DeepClazz clazz1 = DeepClazz.getInstance();
        DeepClazz clazz2 = (DeepClazz) clazz1.clone();

        // false
        System.out.println(clazz1 == clazz2);

    }
}
